<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
use App\Http\Requests\AuthRequests\UploadRequest;

class UploadController extends Controller
{
    /**
     * 图片上传（本地）
     * @param UploadRequest $request
     * @return \Illuminate\Http\Response
     */
    public function uploadFile(UploadRequest $request)
    {
        $file = $request->file('file');
        // 此时 $this->upload如果成功就返回文件名不成功返回false
        $fileName = $this->upload($file);
        if ($fileName) {
            return $this->array(['fileUrl' => env('APP_URL') . $fileName]);
        }
        $this->error();
    }

    /**
     * 验证文件是否合法
     */
    public function upload($file, $disk = 'public')
    {
        // 1.是否上传成功
        if (!$file->isValid()) {
            return false;
        }

        // 2.是否符合文件类型 getClientOriginalExtension 获得文件后缀名
        $fileExtension = $file->getClientOriginalExtension();
        if (!in_array($fileExtension, ['png', 'jpg', 'gif', 'jpeg'])) {
            return false;
        }

        // 3.判断大小是否符合 2M
        $tmpFile = $file->getRealPath();
        if (filesize($tmpFile) >= 20480000) {
            return false;
        }

        // 4.是否是通过http请求表单提交的文件
        if (!is_uploaded_file($tmpFile)) {
            return false;
        }

        // 5.每天一个文件夹,分开存储, 生成一个随机文件名
        $fileName = date('Y_m_d') . '/' . md5(time()) . mt_rand(0, 9999) . '.' . $fileExtension;
        if (Storage::disk($disk)->put($fileName, file_get_contents($tmpFile))) {
            return Storage::url($fileName);
        }
    }
}
